Skip to main content

批量赋值和 Transform 的交互

· 12 min read

背景和动机

参考年底攻坚项目背景:https://docs.popo.netease.com/lingxi/f946eeb5180d4f5b9db92157e252ce42#edit

  • 赋值多字段代码量过大,操作过于繁琐
  • Transform 函数的大多数交互是返回一个新构造的实例

示例 1:批量赋值

已知的内置库和一些数据结构:

老的代码语义

详细设计

最基本的二元赋值根据类型分析

typeof 左边 \ typeof 右边基础类型复合类型List { length }Map
基础类型本身本身或某级子字段本身或 length本身
复合类型本身本身或某级子字段本身或 length本身
List { length }不允许不允许不允许不允许
Map { values, keys }不允许不允许不允许不允许

批量赋值方案一:类似 Object.assign 的设计

优点

  • 路径短,省事
  • 实现成本低

缺点

  • 左右只允许复合类型
  • 自定义程度不高,其他功能仍然需要普通赋值解决
  • 与 Transform(map) 函数结合不起来

批量赋值方案二:多变量批量赋值(采用此方案)

批量赋值和 Transform(map) 很容易让人想到连线映射的交互。

语义原理:Parallel assignment,TypeScript/JavaScript 中的数组析构赋值。

Java 示例:

优点

  • 可以代替原来的简单赋值
  • 与 Transform(map) 函数容易结合

缺点

  • 复杂起来线很多
  • 要不要支持表达式塞入?可能会很重量级
  • 顺序要理清
  • 其它问题见交互稿

批量赋值方案三:坑位批量赋值

左边只能选择复合类型的变量,右边随意。

优点

  • 相比方案一,右侧灵活性更高
  • 交互和以前的比较接近,适配性高,与之后 Transform(map) 的交互一致性高
  • 没有明显的顺序问题
  • 实现成本较低

缺点

  • 选变量可能没连线方便和直观
  • 左侧只允许复合类型

Transform 方案一:坑位 New 函数

假定最近的版本中,Transform 的 lambda 只支持放一个表达式。

lambda 返回类型为基础类型复合类型List { length }Map
交互形式使用一个“选择变量框”构造器可能也是想要构造器构造器?

示例 2:使用 Transform 的表达

这里貌似主要应该扩充 New 内置函数的能力,原来的 New 函数的交互最接近“坑位批量赋值”。

优缺点与“批量赋值方案三:坑位批量赋值”一样。

Transform 方案二:连线 New 函数(采用此方案)

与上一种方案语义一样,只是交互不同。

优缺点与“批量赋值方案二:多变量批量赋值”一样。

结论

  1. 连线和坑位
    • 选择连线
  2. 赋值和批量赋值要不要分开?
    • 右侧工具栏只有允许有一个赋值组件
    • 遗留交互问题:普通赋值和批量赋值的切换问题(交互已解决)
    • 遗留交互问题:泳道连续快捷添加(交互已解决)
  3. 左右表达式
    • 右侧允许多个任意表达式
    • 左侧只允许一个任意表达式
  4. 自动连接
    • 字段名或变量名和类型和左边都匹配才能自动连接
  5. 没有连线的字段
    • 遗留交互问题:没有连线类似 unused expression,可以加个未使用的效果(交互已解决)
  6. 左侧字段来源唯一
    • 不允许多条线同时连入左侧一个点
    • 不允许父子同时产生连线
    • 通过互斥解决掉了顺序问题
  7. 折叠字段的交互
    • 遗留交互问题:折叠起来线的交互交互(交互已解决)
  8. 递归引用和空指针问题
    • 递归引用只允许展开一级(其他用户自己想办法吧)
    • 空指针运行时报出
  9. 相同类型的 item 可以通过拖拽取代掉

未解决的问题

  • 后续考虑:字段要计算、流式数据处理等
  • 只读属性需要在语法树上添加一种区分
  • 批量赋值的语法树等确定方案后再设计
  • 批量赋值的全键盘操作